package ar.com.profertil.frances.parser;

import java.io.Serializable;

import ar.com.profertil.frances.analizer.AnalizerRecibirArchivo;
import ar.com.profertil.frances.entity.ArchivoPagosRecibidoFrances;
import ar.com.profertil.frances.entity.DetalleA;
import ar.com.profertil.frances.entity.DetalleB;
import ar.com.profertil.frances.entity.DetalleC;
import ar.com.profertil.frances.entity.DetalleD;
import ar.com.profertil.utils.entity.RecibirArchivoEntity;
import ar.com.profertil.utils.parser.ParserIdoc;

/**
 * The Class ParserIdocArchivoPagosFrances.
 *
 * @author augusto.ferrari@softtek.com
 * 
 * Esta clase se encarga de definir los metodos para parsear los datos y generar las salidas correspondientes.
 */
public class ParserIdocArchivoPagosFrances extends ParserIdoc implements Serializable {

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = 2996905317669627868L;
	
	@Override
	public RecibirArchivoEntity armarIdocArchivoRecibido(String doc) {
		ArchivoPagosRecibidoFrances archivoPagosRecibidoFrances = new ArchivoPagosRecibidoFrances();
		AnalizerRecibirArchivo analizer = new AnalizerRecibirArchivo();
		
		analizer.inicializar(doc);
		
		//Llenado datos Header.
		String header = analizer.getHeader();
		archivoPagosRecibidoFrances.getHeader().setCodigoRegistro(header.substring(0,1));
		archivoPagosRecibidoFrances.getHeader().setIdentificadorEmpresa(header.substring(1, 8));
		archivoPagosRecibidoFrances.getHeader().setNumeroArchivo(header.substring(8, 14));
		archivoPagosRecibidoFrances.getHeader().setNumeroSecuencia(header.substring(14, 24));
		archivoPagosRecibidoFrances.getHeader().setFechaDesde(header.substring(24, 32));
		archivoPagosRecibidoFrances.getHeader().setFechaHasta(header.substring(32, 40));
		archivoPagosRecibidoFrances.getHeader().setTotalRegistros(header.substring(40, 46));
		archivoPagosRecibidoFrances.getHeader().setTotalImportes(header.substring(46, 61));
		archivoPagosRecibidoFrances.getHeader().setMoneda(header.substring(61, 64));
		archivoPagosRecibidoFrances.getHeader().setCuuentaHija(header.substring(64, 84));
		archivoPagosRecibidoFrances.getHeader().setTitulo(header.substring(84, 124));
		archivoPagosRecibidoFrances.getHeader().setCuenta(header.substring(124, 144));
		archivoPagosRecibidoFrances.getHeader().setFiller(header.substring(144, 350));
		
		//Lenado datod DetalleA.
		String detallesA[] = analizer.getDetalleA();
		archivoPagosRecibidoFrances.inicializarDetalleA(detallesA.length);
		
		for(int i = 0; i < detallesA.length; i++) {
			DetalleA detalle = new DetalleA();
			detalle.setCodigoRegistro(detallesA[i].substring(0, 1));
			detalle.setCodigoServicio(detallesA[i].substring(1, 8));
			detalle.setNumeroArchivo(detallesA[i].substring(8, 14));
			detalle.setNumeroSecuencia(detallesA[i].substring(14, 24));
			detalle.setNumeroSucursalPago(detallesA[i].substring(24, 27));
			detalle.setNumeroDepositante(detallesA[i].substring(27, 45));
			detalle.setComprobante(detallesA[i].substring(45, 63));
			detalle.setImportePago(detallesA[i].substring(63, 78));
			detalle.setTipoValor(detallesA[i].substring(78, 80));
			detalle.setFechaEmision(detallesA[i].substring(80, 88));
			detalle.setFechaPago(detallesA[i].substring(88, 96));
			detalle.setNumeroLegajo(detallesA[i].substring(96, 104));
			detalle.setHoraPago(detallesA[i].substring(104, 112));
			detalle.setFiller1(detallesA[i].substring(112, 189));
			detalle.setCodigoBarra(detallesA[i].substring(189, 259));
			detalle.setTipoDocumento(detallesA[i].substring(259, 261));
			detalle.setNumeroDocumento(detallesA[i].substring(261, 274));
			detalle.setNombre(detallesA[i].substring(274, 304));
			detalle.setApellido(detallesA[i].substring(304, 334));
			detalle.setFechaAcreditacion(detallesA[i].substring(334, 342));
			detalle.setMasivo(detallesA[i].substring(342, 343));
			detalle.setInformadoPrimeraVez(detallesA[i].substring(343, 344));
			detalle.setFiller2(detallesA[i].substring(344, 349));
			detalle.setFiller3(detallesA[i].substring(349, 350));
			
			archivoPagosRecibidoFrances.agregarDetalleA(i, detalle);
		}
		
		//TODO Validar si esta bien el mapeo
		//Llenado datos DetalleB.
		String[] detallesB = analizer.getDetalleB();
		archivoPagosRecibidoFrances.inicializarDetalleB(detallesB.length);
		
		for(int i = 0; i < detallesB.length; i++) {
			DetalleB detalle = new DetalleB();
			detalle.setCodigoRegistro(detallesB[i].substring(0, 1)); // 1
			detalle.setCodigoServicio(detallesB[i].substring(1, 8)); // 7
			detalle.setNumeroArchivo(detallesB[i].substring(8, 14)); // 6
			detalle.setNumeroSecuencia(detallesB[i].substring(14, 24)); // 10
			detalle.setTipoComprobante(detallesB[i].substring(24, 25)); // 1
			detalle.setPagoParcial(detallesB[i].substring(25, 26)); // 1
			detalle.setFiller1(detallesB[i].substring(26, 27)); // 1
			detalle.setNumeroDepositante(detallesB[i].substring(27, 45)); // 18
			detalle.setnumeroComprobante(detallesB[i].substring(45, 63)); // 18
			detalle.setImporteFactura(detallesB[i].substring(63, 78));
			detalle.setFechaVencimiento(detallesB[i].substring(78, 86));
			detalle.setFechaVigencia(detallesB[i].substring(86, 94));
			detalle.setCodigoConcepto(detallesB[i].substring(94, 118));
			detalle.setDescripcionConcepto(detallesB[i].substring(118, 142));
			detalle.setLeyenda(detallesB[i].substring(142, 180));
			detalle.setFiller2(detallesB[i].substring(180, 189));
			detalle.setCodigoBarra(detallesB[i].substring(189, 259));
			detalle.setFiller3(detallesB[i].substring(259, 350));

			archivoPagosRecibidoFrances.agregarDetalleB(i, detalle);
		}
		
		//Llenado datos DetalleC.
		String[] detallesC = analizer.getDetalleC();
		archivoPagosRecibidoFrances.inicializarDetalleC(detallesC.length);
		
		for(int i = 0; i < detallesC.length; i++) {
			DetalleC detalle = new DetalleC();
			detalle.setCodigoRegistro(detallesC[i].substring(0, 1));
			detalle.setCodigoServicio(detallesC[i].substring(1, 8));
			detalle.setNumeroArchivo(detallesC[i].substring(8, 14));
			detalle.setNumeroSecuencia(detallesC[i].substring(14, 24));
			detalle.setFiller1(detallesC[i].substring(24, 64));
			detalle.setImporte(detallesC[i].substring(63, 78));
			detalle.setTipoValor(detallesC[i].substring(78, 80));
			detalle.setNumeroBoleta(detallesC[i].substring(80, 88));
			detalle.setCantidadCheques(detallesC[i].substring(88, 92));
			detalle.setFiller2(detallesC[i].substring(92, 350));
			
			archivoPagosRecibidoFrances.agregarDetalleC(i, detalle);
		}
		
		//Llenado datos DetalleD.
		String[] detallesD = analizer.getDetalleD();
		archivoPagosRecibidoFrances.inicializarDetalleD(detallesD.length);
		
		for(int i = 0; i < detallesD.length; i++) {
			DetalleD detalle = new DetalleD();
			detalle.setCodigoRegistro(detallesD[i].substring(0, 1));
			detalle.setCodigoServicio(detallesD[i].substring(1, 8));
			detalle.setNumeroArchivo(detallesD[i].substring(8, 14));
			detalle.setNumeroSecuencia(detallesD[i].substring(14, 24));
			detalle.setFiller1(detallesD[i].substring(24, 63));
			detalle.setImporteCheque(detallesD[i].substring(63, 78));
			detalle.setFormaPago(detallesD[i].substring(78, 80));
			detalle.setBoleta(detallesD[i].substring(80, 88));
			detalle.setNumeroCheque(detallesD[i].substring(88, 96));
			detalle.setBancoEmisor(detallesD[i].substring(96, 100));
			detalle.setSucursal(detallesD[i].substring(100, 104));
			detalle.setCodigoPostal(detallesD[i].substring(104, 108));
			detalle.setCuenta(detallesD[i].substring(108, 119));
			detalle.setFechaValor(detallesD[i].substring(119, 127));
			detalle.setEstado(detallesD[i].substring(127, 128));
			detalle.setDescripcionError(detallesD[i].substring(128, 158));
			detalle.setEstadoReal(detallesD[i].substring(158, 159));
			detalle.setFiller2(detallesD[i].substring(159, 350));
			
			archivoPagosRecibidoFrances.agregarDetalleD(i, detalle);
		}
		
		return archivoPagosRecibidoFrances;
	}
}
